package anno;

import com.sun.xml.internal.ws.api.model.wsdl.WSDLBoundOperation;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.Arrays;

public class AnnoTest {

    /*
    AnnotatedElement接口
    getAnnotation(Class<T> annotationClass)：
    返回该程序元素上存在的、指定类型的注释，如果该类型的注释不存在，则返回null。
    Annotation[] getAnnotations()：返回该程序元素上存在的所有注释。
    boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)：
    判断该程序元素上是否包含指定类型的注释，存在则返回true，否则返回false。
     */
    public static void main(String[] args) throws Exception {
        // 从属性上提取注解信息
        // 首先要获取Field(使用反射)
        Class c = Class.forName("anno.Person");
        Field field = c.getDeclaredField("name");
        field.setAccessible(true);


        System.out.println("--------------------");

        Annotation[] annotations = field.getAnnotations();
        for (Annotation anno : annotations) {
            System.out.println(anno);
        }
        System.out.println("--------------------");


        // 是否包含自定义的注解
        boolean flag = field.isAnnotationPresent(CustomAnno.class);
        if (flag) {
            CustomAnno anno = field.getAnnotation(CustomAnno.class);

            System.out.println(anno.value());
            System.out.println(Arrays.toString(anno.name()));


        }

        /*
        拓展功能:
            一个类里面包含了一个自定义的引用数据类型属性
            通过注解 + 反射 设置属性值
            通过Field 和 Method(set方法) 实现
         */

    }
}
